﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;


namespace Integra.Comun
{
         /// <summary>
      /// Formas de carga de un combo
      /// </summary>
      public enum TipoCargaCombo
      {
            /// <summary>
            /// Normal
            /// </summary>
            Normal=0,
            /// <summary>
            /// Inserta un elemento vacio y lo selecciona
            /// </summary>
            Opcional,
            /// <summary>
            /// Inserta un elemento de selección "Seleccione una opcion..."
            /// </summary>
            Seleccion
      };
 
      /// <summary>
      /// Clase estatica para el la gestión y manipulación de datos
      /// y operaciones de binding
      /// </summary>
      public class ControlDatos
      {
          /// <summary>
          /// Crea una cadena que identifica un conjunto de columnas
          /// </summary>
          /// <param name="pColumns"></param>
          /// <returns></returns>
          public static string CrearClave(params object[] pColumns)
          {
              string strExp = "";
              foreach (object str in pColumns)
              {
                  strExp = strExp + str.ToString() + ",";
              }
              return strExp.Substring(0, strExp.Length - 1);
          }

          /// <summary>
          /// Retorna el conjunto de claves seleccionado en un combo
          /// </summary>
          public static object[] ItemSeleccionado(ComboBox cbo)
          {
              string strValue = cbo.SelectedValue.ToString();
              string[] str = strValue.Split(',');
              return str;
          }

          /// <summary>
          /// Retorna el conjunto de valores de una columna compuesta
          /// </summary>
          public static object[] ValoresItem(string ID)
          {
              string[] str = ID.Split(',');
              return str;
          }

          /// <summary>
          /// Añade una columna compuesta a un datatable resultado de la expresion de varias columnas
          /// </summary>
          /// <param name="dt"></param>
          /// <param name="SumColumns"></param>
          public static void AgregarColumnaCombo(DataTable dt, string[] SumColumns)
          {
              string strExp = "";

              foreach (string str in SumColumns)
              {
                  strExp = strExp + str + " + ',' + ";
              }
              strExp = strExp.Substring(0, strExp.Length - 9);
              dt.Columns.Add(new DataColumn("ID", typeof(string), strExp));
          }

          /// <summary>
          /// Carga un combo con un objeto de datos y establece una columna como expresion de varias
          /// </summary>
          /// <param name="cbo">Control combo o lista</param>
          /// <param name="Data">Origen de datos (Dataset, DataView,...)</param>
          /// <param name="DisplayMember">Nombre del campo de texto</param>
          /// <param name="ValueMember">Nombre del campo valor</param>
          /// <param name="Tipo">Tipo de carga del combo</param>
          /// <returns>true si se realiza correctamente la carga</returns>
          public static bool CargarCombo(ListControl cbo, object Data, string DisplayMember, string[] ValueMember, TipoCargaCombo Tipo)
          {
              string strFilter = "", strSort = "";
              DataView dvData = null;
              //if (Data is DSBase)
              //{
              //    if (!((DSBase)Data).Valida())
              //    {
              //        //mFormBaseParent.ControlExcepciones.MostrarTodas(((TransportBase)Data).Excepciones);
              //        return false;
              //    }
              //    dvData = ((DataView)Data).Table.DefaultView;
              //}
              if (Data is DataTable)
              {
                  dvData = ((DataTable)Data).DefaultView;
              }
              if (Data is DataView)
              {
                  dvData = (DataView)Data;
                  strFilter = dvData.RowFilter;
                  strSort = dvData.Sort;
              }
              DataTable dt = dvData.Table.Copy();
              if (ValueMember.Length == 1)
              {
                  cbo.ValueMember = ValueMember[0];
              }
              else
              {
                  AgregarColumnaCombo(dt, ValueMember);
                  cbo.ValueMember = "ID";
              }

              if (Tipo == TipoCargaCombo.Opcional)
              {
                  DataRow dr = dt.NewRow();
                  foreach (string str in ValueMember)
                  {
                      dr[str] = 0;
                  }
                  dt.Rows.Add(dr);
              }

              if (Tipo == TipoCargaCombo.Seleccion)
              {
                  DataRow dr = dt.NewRow();
                  foreach (string str in ValueMember)
                  {
                      dr[str] = 0;
                  }
                  dr[DisplayMember] = "Seleccione una opcion...";
                  dt.Rows.Add(dr);
              }

              dvData = dt.DefaultView;
              dvData.RowFilter = strFilter;
              dvData.Sort = strSort;

              cbo.DataSource = dvData;
              cbo.DisplayMember = DisplayMember;

              return true;
          }

          /// <summary>
          /// Carga un combo con un objeto de datos y establece una columna como expresion de varias
          /// </summary>
          /// <param name="cbo">Control combo o lista</param>
          /// <param name="Data">Origen de datos (Dataset, DataView,...)</param>
          /// <param name="DisplayMember">Nombre del campo de texto</param>
          /// <param name="ValueMember">Nombre del campo valor</param>
          /// <param name="Tipo">Tipo de carga del combo</param>
          /// <returns>true si se realiza correctamente la carga</returns>
          public static bool CargarCombo(ListControl cbo, object Data, string DisplayMember, string ValueMember, TipoCargaCombo Tipo)
          {
              return CargarCombo(cbo, Data, DisplayMember, new string[] { ValueMember }, Tipo);
          }

          /// <summary>
          /// Carga un combo con los valores de un tipo enumerado.
          /// Las descripciones se toman de un fichero de recursos
          /// con las claves Enum+NombreTipoEnumerado+NombreValorEnumerado
          /// </summary>
          /// <param name="combo">Control combo o lista</param>
          /// <param name="enumerado">Tipo enumerado</param>
          /// <param name="Tipo">Tipo de carga</param>
          /// <param name="ResourceName">Nombre del fichero de recursos</param>
          public static void CargarCombo(ListControl combo, Type enumerado, TipoCargaCombo Tipo, string ResourceName)
          {
              CargarCombo(combo, GetTableFromEnum(enumerado, ResourceName), "Texto", "Codigo", Tipo);
          }

          /// <summary>
          /// Carga un combo con los valores de un tipo enumerado.
          /// Las descripciones son los propios nombres de los valores en el enumerado
          /// </summary>
          /// <param name="combo">Control combo o lista</param>
          /// <param name="enumerado">Tipo enumerado</param>
          /// <param name="Tipo">Tipo de carga</param>
          public static void CargarCombo(ListControl combo, Type enumerado, TipoCargaCombo Tipo)
          {
              CargarCombo(combo, GetTableFromEnum(enumerado), "Texto", "Codigo", Tipo);
          }

          /// <summary>
          /// Carga un combo con las opciones Sí y No
          /// </summary>
          /// <param name="combo">Control combo o lista</param>
          /// <param name="Tipo">Tipo de carga</param>
          public static void CargarComboBooleano(ListControl combo, TipoCargaCombo Tipo)
          {
              DataTable dtReturn = new DataTable("Bool");
              DataRow dr;
              dtReturn.Columns.Add("Codigo", typeof(System.Int32));
              dtReturn.Columns.Add("Texto", typeof(System.String));
              dtReturn.PrimaryKey = new DataColumn[] { dtReturn.Columns["Codigo"] };

              if (Tipo == TipoCargaCombo.Opcional)
              {
                  dr = dtReturn.NewRow();
                  dr["Codigo"] = -1;
                  dr["Texto"] = "";
                  dtReturn.Rows.Add(dr);
              }
              else if (Tipo == TipoCargaCombo.Seleccion)
              {
                  dr = dtReturn.NewRow();
                  dr["Codigo"] = -1;
                  dr["Texto"] = "Seleccione una opcion...";
                  dtReturn.Rows.Add(dr);
              }

              dr = dtReturn.NewRow();
              dr["Codigo"] = 1;
              dr["Texto"] = "Sí";
              dtReturn.Rows.Add(dr);

              dr = dtReturn.NewRow();
              dr["Codigo"] = 0;
              dr["Texto"] = "No";
              dtReturn.Rows.Add(dr);

              dtReturn.AcceptChanges();

              CargarCombo(combo, dtReturn, "Texto", "Codigo", TipoCargaCombo.Normal);
          }

          protected static DataTable GetTableFromEnum(Type enumerado, string recurso)
          {
              DataTable dtReturn = new DataTable(enumerado.Name);
              DataRow dr;
              dtReturn.Columns.Add("Codigo", typeof(System.Int32));
              dtReturn.Columns.Add("Texto", typeof(System.String));
              dtReturn.PrimaryKey = new DataColumn[] { dtReturn.Columns["Codigo"] };

              Array values = Enum.GetValues(enumerado);
              string[] nombres = Enum.GetNames(enumerado);
              for (int i = 0; i < nombres.Length; i++)
              {
                  dr = dtReturn.NewRow();
                  dr["Codigo"] = (int)values.GetValue(i);
                  dr["Texto"] = "Enum" + enumerado.Name;
                  dtReturn.Rows.Add(dr);
              }
              dtReturn.AcceptChanges();
              return dtReturn;
          }

          protected static DataTable GetTableFromEnum(Type enumerado)
          {
              DataTable dtReturn = new DataTable(enumerado.Name);
              DataRow dr;
              dtReturn.Columns.Add("Codigo", typeof(System.Int32));
              dtReturn.Columns.Add("Texto", typeof(System.String));
              dtReturn.PrimaryKey = new DataColumn[] { dtReturn.Columns["Codigo"] };

              Array values = Enum.GetValues(enumerado);
              string[] nombres = Enum.GetNames(enumerado);
              for (int i = 0; i < nombres.Length; i++)
              {
                  dr = dtReturn.NewRow();
                  dr["Codigo"] = (int)values.GetValue(i);
                  dr["Texto"] = nombres[i].ToString();
                  dtReturn.Rows.Add(dr);
              }
              dtReturn.AcceptChanges();
              return dtReturn;
          }
      }
 
}